約 3,127,076 件
https://w.atwiki.jp/nikonikogakkai01/
@wikiへようこそ ウィキはみんなで気軽にホームページ編集できるツールです。 このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 用途別のオススメ機能紹介 @wikiの設定/管理 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください @wiki助け合いコミュニティの掲示板スレッド一覧 #atfb_bbs_list その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) おすすめ機能 気になるニュースをチェック 関連するブログ一覧を表示 その他にもいろいろな機能満載!! @wikiプラグイン @wiki便利ツール @wiki構文 @wikiプラグイン一覧 まとめサイト作成支援ツール バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、メールでお問い合わせください。
https://w.atwiki.jp/anime_wiki/pages/37445.html
ここを編集 ■Helck 動画検査 ■関連タイトル Blu-ray Helck 1 rakuten_design= slide ;rakuten_affiliateId= 053df7e0.7c451bd1.0c852203.190c5695 ;rakuten_items= ctsmatch ;rakuten_genreId=0;rakuten_size= 468x160 ;rakuten_target= _blank ;rakuten_theme= gray ;rakuten_border= on ;rakuten_auto_mode= on ;rakuten_genre_title= off ;rakuten_recommend= on ; 随時更新! pixivFANBOX アニメ@wiki ご支援お待ちしています! ムック本&画集新刊/個人画集新刊/新作Blu-ray単巻/新作Blu-ray DVD-BOX アニメ原画集全リスト スタッフインタビューwebリンク集 最新登録アイテム Switch ゼルダの伝説 Tears of the Kingdom Switch 世界樹の迷宮Ⅰ・Ⅱ・Ⅲ HD REMASTER Switch ピクミン 4 大友克洋 Animation AKIRA Layouts Key Frames 2 小説 機動戦士ガンダム 水星の魔女 1 ONE PIECE FILM REDデラックス・リミテッド・エディション 4K ULTRA HD Blu-ray Blu-ray 劇場版 ソードアート・オンライン -プログレッシブ- 冥き夕闇のスケルツォ 完全生産限定版 Blu-ray 映画『ゆるキャン△』 Blu-ray 【コレクターズ版】 Blu-ray ウマ娘 プリティーダービー 4th EVENT SPECIAL DREAMERS!! Blu-ray 天地無用!GXP パラダイス始動編 Blu-ray第1巻 特装版 天地無用!魎皇鬼 第伍期 Blu-ray SET 「GS美神」全話いっき見ブルーレイ Blu-ray ソードアート・オンライン -フルダイブ- メーカー特典:「イベントビジュアル使用A3クリアポスター」付 ラブライブ!虹ヶ咲学園スクールアイドル同好会 5th Live! 虹が咲く場所 Blu-ray Memorial BOX 宇宙戦艦ヤマト2202 愛の戦士たち Blu-ray BOX 特装限定版 地球へ… Blu-ray Disc BOX 完全生産限定版 神風怪盗ジャンヌ Complete Blu-ray BOX HUNTER×HUNTER ハンター試験編・ゾルディック家編Blu-ray BOX BLEACH Blu-ray Disc BOX 破面篇セレクション1+過去篇 完全生産限定版 MAZINGER THE MOVIE 1973-1976 4Kリマスター版 アニメ・ゲームのロゴデザイン シン・仮面ライダー 音楽集 テレビマガジン特別編集 仮面ライダー 完全版 EPISODE No.1~No.98 MOVIE リスアニ!Vol.50.5 ぼっち・ざ・ろっく!号デラックスエディション ヤマノススメ Next Summit アニメガイド おもいでビヨリ アニメ「魔入りました!入間くん」オフィシャルファンブック 『超時空要塞マクロス』パッケージアート集 CLAMP PREMIUM COLLECTION X 1 トーマの心臓 プレミアムエディション パズル ドラゴンズ 10th Anniversary Art Works はんざわかおり こみっくがーるず画集 ~あばばーさりー!~ あすぱら画集 すいみゃ Art Works trim polka-トリムポルカ- つぐもも裏 超!限界突破イラスト&激!すじ供養漫画集 開田裕治ウルトラマンシリーズ画集 井澤詩織1st写真集 mascotte 鬼頭明里写真集 my pace 内田真礼 1st photobook 「まあやドキ」 進藤あまね1st写真集 翠~Midori~ 声優 宮村優子 対談集 アスカライソジ 三石琴乃 ことのは 亀田祥倫アートワークス 100% 庵野秀明責任編集 仮面ライダー 資料写真集 1971-1973 金子雄司アニメーション背景美術画集 タローマン・クロニクル ラブライブ!サンシャイン!! Find Our 沼津~Aqoursのいる風景~ 機動戦士ガンダム 逆襲のシャア 友の会[復刻版] 梅津泰臣 KISS AND CRY 資料集 安彦良和 マイ・バック・ページズ 『機動戦士ガンダム ククルス・ドアンの島』編 氷川竜介 日本アニメの革新 歴史の転換点となった変化の構造分析 Blu-ray THE IDOLM@STER CINDERELLA GIRLS 10th Anniversary Celebration Animation ETERNITY MEMORIES Blu-ray おいら宇宙の探鉱夫 ブルーレイ版 Blu-ray 映画 バクテン!! 完全生産限定版 アイカツ! 10th STORY ~未来へのSTARWAY~ Blu-ray BOX 初回生産限定版 はたらく細胞 Blu-ray Disc BOX 完全生産限定版 Blu-ray 長靴をはいた猫 3作品収録 Blu-ray わんぱく王子の大蛇退治 Blu-ray 魔道祖師 完結編 完全生産限定版 魔道祖師Q Blu-ray Disc BOX 完全生産限定盤 にじよん あにめーしょん Blu-ray BOX 【特装限定版】 Blu-ray 鋼の錬金術師 完結編 プレミアム・エディション Blu-ray付き やはりゲームでも俺の青春ラブコメはまちがっている。完 限定版【同梱物】オリジナルアニメ Blu-ray「だから、思春期は終わらずに、青春は続いていく。」
https://w.atwiki.jp/bero/pages/25.html
Smash Attacksの使い方 このページではPhantom Wings氏が作ったプログラム「Smash Attacks」の使い方について説明します。同コンテンツがBrawl+ Wikiにも存在しますが管理人さんより削除依頼が来ましたらすぐに削除いたします。 1.ファイルを開く +... まず各キャラクターの性能?データ FitXX(数字は入らない).pac を開きましょう。 また、後の作業のためにBrawlBoxでアニメーションエディタも起動しておくと良いでしょう。 2.Sub Action画面の操作 +... Sub Action画面での操作は以下の通りです アニメーション名はアニメーションエディタのものと同じです 操作 動き Add Eventの追加 Modify 選択中のEventの編集 Remove 選択中のEventの削除 ▲・▼ 選択中のEventの移動 Copy・Paste 選択中のEventのコピー・貼り付け 3.Eventの編集 +... 編集したいEventを選択してModifyをクリックしてください。 編集画面が表示されます。
https://w.atwiki.jp/wiki1_test/pages/5583.html
$$ (x + a)(x - a) = x^2 -a^2 $$
https://w.atwiki.jp/koiru/pages/36.html
簡単にまとめてみた poke.exe Perl版 poke.exe 1.解凍する 2.[poke.exe]を実行する 3.コイル(゚Д゚ )ウマー ほかのポケモンにする[setting.ini]を開く choice= の部分をいじる(8コイル 7ジバコイル 9タテトプス) 再起動 (゚Д゚ )ウマー 鯖をかえてみる[PostURL][CookieSetURL]をそれぞれ同じ値に変える Perl版 1.Perlをインスコする 2.ファイルを指定して 3.実行(゚Д゚ )ウマー
https://w.atwiki.jp/forns/pages/17.html
そもそもAviutlとは いろんなことができる無料動画編集ソフトのこと。 読み方は「エーブイアイユーティーエル」か「エーブイアイユーティル」。 どちらでもよい。 ただWindowsでしか動作しないから注意。 入れたほうがいいもの Aviutl本体 拡張編集プラグイン この2つは絶対に入れましょう。 それ以外に L-SMASH Works DirectShow File Reader のいずれかを適応させなくてはいけません。 なんで?→Aviutl単体では.aviや.wavファイルしか読み込めないからです 上記2つのどちらか(あるいはどちらも)を適応させることで初めて.mp3や.mp4が読み込めるようになります。 大きなこだわりがなければ、L-SMASH Worksのほうが安定しているのでそちらを使いましょう。 また既存の状態だと.aviの拡張子でしか出力できないので x264guiEx を使用したほうがいいでしょう(筆者はx265の良さがわからんかった) ってことで次からは軽くDLのやり方を・・・ DLの仕方 Aviutlと拡張編集プラグイン 検索エンジンで「Aviutlのお部屋」と検索しましょう。 サイトに飛んだら一番上のAviutlの最新版 と拡張編集Pluginの最新版 をDLしましょう。 (2023/08/16時点の最新版はAviutl110.zipとexedit92.zip) L-SMASH Works 検索エンジンで「L-SMASH Works」と検索しましょう。 RePOPnというサイトが一番上に出てくると思います。 そのサイトを開いて少しスクロールしたところにあるダウンロードを探します。 一番上のL-SMASH Works rxxx (release x)というファイルをDLしましょう。 (2023/08/16時点の最新版はL-SMASH Works r940 release1) DirectShow File Reader 検索エンジンで「DirectShow File Reader」と検索しましょう。 Aviutl実験室のサイトのものが一番上に出てくると思います。 上のほうにダウンロードって書いてあるのを探します。 んでds_inputxxxa.lzhをDLします。 (2023/08/16時点の最新版はds_input026a.lzh) x264guiEx 検索エンジンで「x264guiEx」と検索しましょう。 一番上のrigayaの日記兼メモ帳に飛びます。 真ん中にあるダウンロード、又は右側のメニューバーからx264guiEx.x.xxに飛びます。 (2023/08/16時点の最新版はx264guiEx.3.xx) そうするとGitHubに飛ぶので、そこで一番上の最新版をDLしましょう。 (2023/10/01時点の最新版は3.23) プラグインの適応方法 まずCドライブおあDドライブ直下にAviutlフォルダを作ります。 そんでAviutl.exeがあるフォルダの中に拡張編集プラグインの中身を全部ぶち込みます。 次に「Plugins」フォルダを作ってL-SMASH Works File ReaderやDirectShow File Readerを入れましょう。 ↓ ↓ ↓ ↓ ↓ ↓ (上、L-SMASH Worksの場合) (上、DirectShow File Readerの場合) もし2つとも導入する場合はどちらも同じフォルダにぶち込みましょう。 このままx264guiExもやっちゃいましょう。 Readmeを見れば書いてますが、一応説明をば DLしたファイルの中身を解凍しないでAviutlフォルダにコピー。以上。 終わり! 初期設定 (上、L-SMASH Works・DirectShow File Reader・x264guiEx全てを導入した場合) その他プラグインは自分でぶち込みたい奴を作ったPluginsフォルダに突っ込みましょう。大体なんとかなります。 わからんかったら自分で調べてね。多分Readmeなりなんなりで書いてると思うよ。 ってことで次はゆるゆるっと初期設定やな。 これが終わったらあとは編集の方法や・・・! 初期設定 とりあえずAviutlを起動しましょう。 中身の設定をゆるゆるっとやっていきます。 ファイル→環境設定→システムの設定 で開いたウィンドウの「再生ウィンドウの動画再生をメインウィンドウに表示する」にはチェックしときましょう。 その次に ファイル→入力プラグインの優先度の設定 でAVI/AV2→自分が導入した入力プラグイン→拡張編集に順番を入れ替えます。 それが済んだらAviutlを再起動しましょう。 使い方 Aviutlを起動して設定→拡張編集の設定を開きます。 これで所謂タイムラインとかいうのが表示できました。 そのままゆるっと使ってみましょう。 タイムライン上で右クリック→新規プロジェクトの作成をクリック 画面サイズは自分が作りたいサイズで フルHDなら1920*1080で。ハーフHDなら1280*720で。 フレームレートも30or60お好みで選択してください。 これで起動できました。 詳しい説明は他のサイト見てください。絶対そっちのがいいです。 タイムライン上で右クリック→メディアオブジェクトの追加でいろんなものが追加できます。 色々いじって遊んでみましょう。
https://w.atwiki.jp/koelling/pages/16.html
ようやくこのwikiの使い方がわかりました。 これから就活の備忘録とか、面接対策とか 自分に必要な書籍とか、忘れないように 記していければと思います。 就職ってまだまだ先かもだけど、親孝行の 1つだとおもうので頑張りたいです^^
https://w.atwiki.jp/carwax/pages/32.html
ゴーグリの上手な使い方 579:名無しさん@そうだドライブへ行こう:2005/11/03(木) 16 03 41 ゴーグリの上手な使い方が知りたいです バケツ2杯くらい水をかけてゴーグリ希釈液でふきあげれば良いですか? ゴーグリする間隔は1週間に1回で良いですか? 581:名無しさん@そうだドライブへ行こう:2005/11/03(木) 17 57 20 579 ゴーグリは洗剤じゃないからちゃんとシャンプー洗車とかして ボディを綺麗にしてからのほうが効果はあるよ。間隔は1―2週間に1回で 十分。 584:名無しさん@そうだドライブへ行こう:2005/11/03(木) 22 01 36 ゴーグリは洗車後濡れたままの状態で希釈液スプレー。 そのまま拭いておしまい。
https://w.atwiki.jp/taktikstarter/pages/4.html
このウィキの使い方 ~4つのステップ~ ■ログインしてみよう! デザインを変えたり、サイト名を変えたりするためには、ログインしないといけないよ。 ログインの方法は、下の手順でログインしてみよう! わからない場合はこちらのページも参考にしてね。 画面の右上にある「ログイン」をクリック! ユーザ名に「taktikstarter」、パスワードには、登録の時に設定したものを入力しよう。 画面の右上に「taktikstarter」と表示されればログイン完了! ■サイト名を変更しよう! サイト名はどこから変えれるの?下の手順にそえばサイト名を変えれるよ! わからない場合はこちらのページも参考にしてね。 ログインしたら、右上にある「設定」をクリック! 表示されたページの左メニューにある、「基本設定」をクリックしよう! そうすると、一番上の「サイト名」と書かれた右側に、今のサイト名が書かれています。 ここを好きな名前に書き換えよう! 書き換え終わったら、一番下にある「設定変更」ボタンをクリック! 右上の 「(設定したサイト名)」へ戻る をクリックすると、サイト名が変わったことが確認できるよ! ■新しいページを作成しよう! 新しくページを作成するにはどうすればいいのか、下の手順にそってやってみよう! わからない場合はこちらのページも参考にしてね。 画面の左上にある「@メニュー」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「新規ページ作成」をクリック! 表示されたページで、作りたいページの名前を入力して、 編集モードは 【初心者向け】ワープロモード を選択しよう。 真ん中の枠の中に、自由に書き込めるよ! 作り終わったら、「ページを保存」をクリックすれば、新しいページの作成は完了! ■このページを編集しよう! 最後に、このトップページを編集しよう! ページ編集の方法がわからない場合はこちらのページも参考にしてね。 左上にある「編集」にマウスを持って行くと、さらにメニューが表示されます。 表示されたメニューから「ページ編集」をクリック! 編集画面が表示されるので、自由に書き換えてみよう。 書き換え終わったら、「ページを保存」をクリックすれば、トップページの編集は完了! もし、wikiで議論する場や掲示板が欲しい場合は? @wikiの姉妹サービスである@chsをご利用ください。 登録はこちらから ← ここをクリックしてください。 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問い合わせフォームからご連絡ください。
https://w.atwiki.jp/thiroyoshi/pages/29.html
MPIの使い方や、動作の仕方といったことのメモ MPIとは? MPIは「Message Passing Interface」ってもので、要するにメッセージでの送受信を行いノード間の協調を図るもの。 これ自体がプログラミング言語なのではなく、ライブラリである。 使用する際には、「mpi.h」または「mpi++.h」をインクルードする必要がある。 メッセージの送受信には用意されている関数を用いる。これにも色々な方法があるよう。 MPIの動作 基本的にMPIを使用する用にコンパイルしたものは、指定したノードの数で実行される。(ノードの数の指定はシェルスクリプトで) 各ノードで実行されるプログラムは実際には同じものが動いている。つまり、すべてmain関数から処理を行っている。 では、何が利点か?それは、各ノードにはプロセス毎にノードの番号(rank)が割り当てられており、これによってif文などを用いて処理の分担を行う。 つまり、MPIは「並列処理」というよりも「分散処理」という側面が強いとも言える。 MPIの使い方 とりあえずサンプルを載せる。 #include stdio.h #include string.h #include iostream #include "mpi++.h" using namespace std; int main(int argc, char* argv[]){ int my_rank; //ノードの番号 int p; //すべてのノードの合計数 int source; //メッセージの送信元番号 int dest; //メッセージの送信先番号 int tag = 0; //メッセージタグ char message[100]; //メッセージ MPI_Status status; MPI_Init( argc, argv); //MPI関数を呼び出すための初期化 MPI_Comm_rank(MPI_COMM_WORLD, my_rank); //今プログラムが走っているノードの番号(rank)を取得 MPI_Comm_size(MPI_COMM_WORLD, p); //ノードの合計数を取得 //printf("Hello! %d\n", my_rank); //cout "Hello! " my_rank endl; //rankが0でないノードでのみ実行する if(my_rank != 0){ //メッセージに以下の文を格納する sprintf(message, "Greetings from process %d", my_rank); //printf("My rank is %d\n", my_rank); //cout "My rank is " my_rank endl; dest = 0; //0ノードに送信先を設定 //0ノードにmessageを送信 MPI_Send(message, strlen(message)+1, MPI_CHAR, dest, tag, MPI_COMM_WORLD); } //0ノードで実行される else{ //全ノード分ループをまわす for(source = 1; source p; source++){ //source番目のノードからmessageを受け取り、 MPI_Recv(message, 100, MPI_CHAR, source, tag, MPI_COMM_WORLD, status); //表示 printf("%s\n", message); //cout message endl; } } //最後の処理 MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] Greetings from process 1 [0] Greetings from process 2 [0] Greetings from process 3 [0] Greetings from process 4 [0] Greetings from process 5 [0] Greetings from process 6 [0] Greetings from process 7 [0] Greetings from process 8 [0] Greetings from process 9 %NQSII(INFO) ------- Output from job 0001 ------- %NQSII(INFO) ------- Output from job 0002 ------- %NQSII(INFO) ------- Output from job 0003 ------- %NQSII(INFO) ------- Output from job 0004 ------- 出力の左端[0]は、0ノードでの出力を表している 各ノードでmain関数がそのまま流れており、if文でmy_rankを判定材料として処理を分担している。 各ノードは0ノードにメッセージを送り、0ノードはそれらを逐一読み取り、表示している。 どのメッセージをどこで受信するかを示すもの →つまり、このタグが合うところでのみメッセージの受信ができる 上記のサンプルで、コメントアウトしているprintfとcoutがある。 →printfはしっかり出力をするが、coutは他のスレッドの割り込みを禁止することができていないようで、表示が割り込まれることがあるので使用しないことをオススメする printfをコメントアウトしなかった場合の出力は以下 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] Hello! 0 [1] Hello! 1 [1] My rank is 1 [0] Greetings from process 1 [0] Greetings from process 2 [0] Greetings from process 3 [0] Greetings from process 4 [0] Greetings from process 5 [0] Greetings from process 6 [0] Greetings from process 7 [0] Greetings from process 8 [0] Greetings from process 9 %NQSII(INFO) ------- Output from job 0001 ------- [2] Hello! 2 [3] Hello! 3 [3] My rank is 3 [2] My rank is 2 %NQSII(INFO) ------- Output from job 0002 ------- [4] Hello! 4 [4] My rank is 4 [5] Hello! 5 [5] My rank is 5 %NQSII(INFO) ------- Output from job 0003 ------- [6] Hello! 6 [6] My rank is 6 [7] Hello! 7 [7] My rank is 7 %NQSII(INFO) ------- Output from job 0004 ------- [8] Hello! 8 [8] My rank is 8 [9] Hello! 9 [9] My rank is 9 各ノードでの出力がどれになっているか注意 また、スパコンでのMPIのプログラムの出力は、outputのファイルはできない。 出力結果は、実行後に作成される「run.sh.o(ジョブID)」というファイルに書き込まれている。 また、同時に出力されている「run.sh.e(ジョブID)」はエラー関係が出力されている。 さらにシェルスクリプトを紹介 #PBS -l cputim_job=00 05 00 //cpu動作時間 #PBS -l memsz_job=2gb //メモリサイズ #PBS -l cpunum_job=2 //使用コア数 #PBS -T vltmpi #PBS -b 5 //ノード数 #PBS -q PCL-B //使用マシン cd MPI_sample //ディレクトリ移動 mpirun_rsh -np 10 ${NQSII_MPIOPTS} ./a.out //数字の10は(ノード数)×(CPUコア数) 内積 これには、MPI_Reduce()という関数を使う。とりあえずサンプル。 #include stdio.h #include string.h #include"mpi++.h" using namespace std; //内積を実際に計算する関数(局所的な計算) int Serial_dot(int x[], int y[], int n){ int i; int sum = 0; for(i = 0; i n; i++) sum = sum + x[i]*y[i]; return sum; } //各ノードの内積をまとめる関数 //各ノードでSerial_dot()でそれぞれの内積を求めて、MPI_Reduce()でまとめる //0ノード以外の返り値は0 int Parallel_dot(int local_x[], int local_y[], int n_bar){ int local_dot; int dot = 0.0; int Serial_dot(int x[], int y[], int m); local_dot = Serial_dot(local_x, local_y, n_bar); printf("local_dot = %d\n", local_dot); MPI_Reduce( local_dot, dot, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); return dot; } int main(int argc, char* argv[]){ int n = 20; //全配列数 int my_rank; //ノード番号 int p; //全ノード数 //MPIの初期化 MPI_Init( argc, argv); //ノード番号取得 MPI_Comm_rank(MPI_COMM_WORLD, my_rank); //全ノード数取得 MPI_Comm_size(MPI_COMM_WORLD, p); int n_bar = n/p; //各ノードでの配列数 int x[n_bar]; int y[n_bar]; int dot; //求める内積 //printf("n_bar = %d\n", n_bar); //初期値設定 for(int i = 0; i n_bar; i++){ x[i] = my_rank; y[i] = my_rank; } //各ノードでの内積計算 dot = Parallel_dot(x,y,n_bar); //if(my_rank == 0) printf("dot = %d\n", dot); MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] local_dot = 0 [1] local_dot = 2 [1] dot = 0 [0] dot = 570 %NQSII(INFO) ------- Output from job 0001 ------- [2] local_dot = 8 [3] local_dot = 18 [3] dot = 0 [2] dot = 0 %NQSII(INFO) ------- Output from job 0002 ------- [4] local_dot = 32 [5] local_dot = 50 [5] dot = 0 [4] dot = 0 %NQSII(INFO) ------- Output from job 0003 ------- [6] local_dot = 72 [7] local_dot = 98 [7] dot = 0 [6] dot = 0 %NQSII(INFO) ------- Output from job 0004 ------- [8] local_dot = 128 [9] local_dot = 162 [9] dot = 0 [8] dot = 0 MPI_Reduce() 計算を行い、指定した根ノードにのみ計算結果を返す。 そのため、他の各ノードでは返り値は0である。 各引数は次のようになっている。 int MPI_Reduce( void operand, //計算したい値のポインタ void result, //計算した結果を保存するポインタ int count, //データをいくつ送るか(数字1つなら1) MPI_Datatype datatype, //送信するデータの型(上ではMPI_INT) MPI_Op operator, //なんの計算をするか(上では総和をとるのでMPI_SUM) int root, //根ノードの番号(0でよい) MPI_Comm comm //特になにもなければMPI_COMM_WORLDでよい ){} MPI_Opについては定義済み操作が多く存在する。それらに関しては、windowsサーバに置いてあるMPIの教科書(p81)を参照のこと 計算結果が格納されるのは、rootに指定したノードでのresultにのみ。 MPI_Allreduce() MPI_Reduce()では根以外のノードでの返り値が0であったが、これでは全てのノードに計算結果を返すことができる。 引数はほぼMPI_Reduce()と同じ。 int MPI_ALLreduce( void operand, //計算したい値のポインタ void result, //計算した結果を保存するポインタ int count, //データをいくつ送るか(数字1つなら1) MPI_Datatype datatype, //送信するデータの型(上ではMPI_INT) MPI_Op operator, //なんの計算をするか(上では総和をとるのでMPI_SUM) MPI_Comm comm //特になにもなければMPI_COMM_WORLDでよい ){} 上記のサンプルプログラムで、MPI_Reduce()をMPI_AllReduce()にしたときの出力結果を示す %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] local_dot = 0 [1] local_dot = 2 [0] dot = 570 [1] dot = 570 %NQSII(INFO) ------- Output from job 0001 ------- [2] local_dot = 8 [3] local_dot = 18 [2] dot = 570 [3] dot = 570 %NQSII(INFO) ------- Output from job 0002 ------- [4] local_dot = 32 [5] local_dot = 50 [5] dot = 570 [4] dot = 570 %NQSII(INFO) ------- Output from job 0003 ------- [6] local_dot = 72 [7] local_dot = 98 [7] dot = 570 [6] dot = 570 %NQSII(INFO) ------- Output from job 0004 ------- [8] local_dot = 128 [9] local_dot = 162 [9] dot = 570 [8] dot = 570 行列とベクトルの積 マトリクスとベクトルの積を並列に行うプログラム。 #include stdio.h #include string.h #include vector #include"mpi++.h" using namespace std; vector double MV(vector vector double iterator local_A, int m, int n, vector double iterator local_x, int local_m, int local_n){ vector double local_y; //計算用の一時変数 local_y.resize(local_n); vector double global_x; //ベクトル全体 global_x.resize(n); vector double global_y; //計算結果のベクトル global_y.resize(n); //各プロセスからベクトルxを集める MPI_Allgather(local_x, local_n, MPI_DOUBLE, global_x.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); //掛け算 for(int i = 0; i local_m; i++){ local_y[i] = 0.0; for(int j = 0; j n; j++) local_y[i] = local_y[i] + local_A[i][j]*global_x[j]; } //計算結果を集める MPI_Allgather(local_y.begin(), local_n, MPI_DOUBLE, global_y.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); return global_y; } int main(int argc, char* argv[]){ int n = 20; int m = 20; int my_rank; int p; MPI_Init( argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, my_rank); MPI_Comm_size(MPI_COMM_WORLD, p); int local_n = n/p; int local_m = m/p; vector double x; vector vector double A; //掛け算する行列(各プロセスで一部ずつをもつ) A.resize(local_m); x.resize(local_n); //掛け算するベクトル(各プロセスで一部ずつをもつ) for(int i = 0; i local_m; i++) A[i].resize(n); for(int a = 0; a local_m; a++){ x[a] = my_rank; for(int b = 0; b n; b++) A[a][b] = 1.0; } //行列×ベクトル vector double y; y = MV(A.begin(),m,n,x.begin(),local_m,local_n); for(int i = 0; i n; i++) printf("y[%d] = %f\n",i,y[i]); MPI_Finalize(); } すぐに使えるであろう関数の形にまで落としこんだ。 行列×ベクトルを行っている部分をこれで置き換えれば、それで事足りるはず。 詳細な仕様はここには書きづらいので、直接聞いてもらえるといいかも。もちろんプログラムから察してくれれば一番だが。 が、簡単に書いておく ・行列A n×n行列。行方向で区切ったものを各プロセスでもつ。つまりlocal_Aはlocal_m×n行列になっている。 ・ベクトルx n行ベクトル。行方向で区切った部分を各プロセスでもつ。つまり各プロセスではlocal_m行のベクトル。 ・プロセス数と行数・列数 当然のことながら、行数・列数はプロセス数で割り切れなければならない。 最後に取得するベクトルyはn行の完全なベクトルになっている。上記のプログラムの出力結果は以下。 プロセス数10・行数列数20で計算 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] y[0] = 90.000000 [0] y[1] = 90.000000 [0] y[2] = 90.000000 [0] y[3] = 90.000000 [0] y[4] = 90.000000 [0] y[5] = 90.000000 [0] y[6] = 90.000000 [0] y[7] = 90.000000 [0] y[8] = 90.000000 [0] y[9] = 90.000000 [0] y[10] = 90.000000 [0] y[11] = 90.000000 [0] y[12] = 90.000000 [0] y[13] = 90.000000 [0] y[14] = 90.000000 [0] y[15] = 90.000000 [0] y[16] = 90.000000 [0] y[17] = 90.000000 [0] y[18] = 90.000000 [0] y[19] = 90.000000 [1] y[0] = 90.000000 [1] y[1] = 90.000000 [1] y[2] = 90.000000 [1] y[3] = 90.000000 [1] y[4] = 90.000000 [1] y[5] = 90.000000 [1] y[6] = 90.000000 [1] y[7] = 90.000000 [1] y[8] = 90.000000 [1] y[9] = 90.000000 [1] y[10] = 90.000000 [1] y[11] = 90.000000 [1] y[12] = 90.000000 [1] y[13] = 90.000000 [1] y[14] = 90.000000 [1] y[15] = 90.000000 [1] y[16] = 90.000000 [1] y[17] = 90.000000 [1] y[18] = 90.000000 [1] y[19] = 90.000000 … … ‥(以下同様) 行列と行列の積 一応できた。早いかはしらんw #include stdio.h #include string.h #include vector #include"mpi++.h" using namespace std; vector vector double MV(vector vector double iterator local_A, int m, int n, vector vector double iterator local_x, int local_m, int local_n){ vector double local_y; local_y.resize(local_n); vector double global_x; global_x.resize(n); vector vector double global_y; global_y.resize(n); for(int i = 0; i n; i++) global_y.resize(n); vector double global_tmp; global_tmp.resize(n); for(int k = 0; k n; k++){ MPI_Allgather(local_x[k].begin(), local_n, MPI_DOUBLE, global_x.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); for(int i = 0; i local_m; i++){ local_y[i] = 0.0; for(int j = 0; j n; j++) local_y[i] = local_y[i] + local_A[i][j]*global_x[j]; } MPI_Allgather(local_y.begin(), local_n, MPI_DOUBLE, global_tmp.begin(), local_n, MPI_DOUBLE, MPI_COMM_WORLD); global_y[k] = global_tmp; } return global_y; } int main(int argc, char* argv[]){ int n = 20; int m = 20; int my_rank; int p; MPI_Init( argc, argv); MPI_Comm_rank(MPI_COMM_WORLD, my_rank); MPI_Comm_size(MPI_COMM_WORLD, p); int local_n = n/p; int local_m = m/p; vector vector double A; vector vector double x; A.resize(local_m); for(int i = 0; i local_m; i++) A[i].resize(n); x.resize(n); for(int i = 0; i n; i++) x[i].resize(local_m); for(int a = 0; a local_m; a++){ for(int b = 0; b n; b++){ A[a][b] = 1.0; x[b][a] = my_rank; } } vector vector double y; y = MV(A.begin(),m,n,x.begin(),local_m,local_n); for(int i = 0; i n; i++){ for(int j = 0; j m; j++) printf("y[%d][%d] = %f\n",j,i,y[j][i]); } MPI_Finalize(); } 出力結果 %NQSII(INFO) ------- Output from job 0000 ------- Warning no access to tty (Bad file descriptor). Thus no job control in this shell. [0] y[0][0] = 90.000000 [1] y[0][0] = 90.000000 [1] y[1][0] = 90.000000 [1] y[2][0] = 90.000000 [1] y[3][0] = 90.000000 [1] y[4][0] = 90.000000 [1] y[5][0] = 90.000000 [1] y[6][0] = 90.000000 [1] y[7][0] = 90.000000 [1] y[8][0] = 90.000000 [1] y[9][0] = 90.000000 [1] y[10][0] = 90.000000 [1] y[11][0] = 90.000000 [1] y[12][0] = 90.000000 [1] y[13][0] = 90.000000 [1] y[14][0] = 90.000000 [1] y[15][0] = 90.000000 [1] y[16][0] = 90.000000 [1] y[17][0] = 90.000000 [1] y[18][0] = 90.000000 [1] y[19][0] = 90.000000 [1] y[0][1] = 90.000000 [1] y[1][1] = 90.000000 [1] y[2][1] = 90.000000 [1] y[3][1] = 90.000000 [1] y[4][1] = 90.000000 [1] y[5][1] = 90.000000 [1] y[6][1] = 90.000000 [1] y[7][1] = 90.000000 [1] y[8][1] = 90.000000 [1] y[9][1] = 90.000000 [1] y[10][1] = 90.000000 [1] y[11][1] = 90.000000 [1] y[12][1] = 90.000000 … … ‥(以下同様) #bf 名前 コメント